package cn.ctbu.xiaopeng.studentscoremanage.service;


import cn.ctbu.xiaopeng.studentscoremanage.anno.Log;
import cn.ctbu.xiaopeng.studentscoremanage.dao.CourseRepository;
import cn.ctbu.xiaopeng.studentscoremanage.dao.SCRepository;
import cn.ctbu.xiaopeng.studentscoremanage.exception.ResultException;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.dto.CourseQueryDTO;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.entity.Course;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.entity.Student;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.vo.CoursePageVO;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author xiaopeng
 * @version 1.0
 */
@Service
@RequiredArgsConstructor
public class CourseService {

    private final CourseRepository courseRepository;


    /**
     * 查询所有课程
     * @return List<Course>
     */
    @Log
    public List<Course> getAllCourse(){
        return courseRepository.findAll();
    }

    /**
     * 根据id查询课程
     * @param id
     * @return
     */
    @Log
    public Course findById(Integer id) {
        return courseRepository.findById(id).orElse(null);
    }

    /**
     * 根据课程名称模糊查询 需要传递 刘%
     *
     * @param cName
     * @return
     */
    @Log
    public List<Course> findByCnameLike(String cName) {
        return courseRepository.findByCnameLike(cName);
    }

    /**
     * 根据课程名称模糊查询 前缀查询 可直接 刘..
     * @param cName
     * @return
     */
    @Log
    public List<Course> findByCnameStartingWith(String cName) {
        return courseRepository.findByCnameStartingWith(cName);
    }

    /**
     * 根据cno查询课程
     *
     * @param cno
     * @return
     */
    @Log
    public Course findByCourseNo(String cno) {
        return courseRepository.findByCourseNo(cno);
    }


    /**
     * 新增课程
     *
     * @param course
     * @return
     */
    @Log
    public Course insert(Course course) {
        return courseRepository.save(course);
    }

    /**
     * 修改课程
     *
     * @param course
     * @return
     */
    @Log
    public Course update(Course course) {
        return courseRepository.save(course);
    }

    /**
     * 根据id删除课程
     *
     * @param id
     */
    @Log
    public void deleteById(Integer id) {
        courseRepository.deleteById(id);
    }

    /**
     * 根据id批量删除课程
     * @param ids
     */
    @Log
    @Transactional
    public void deleteCoursesByIds(List<Integer> ids) {
        if (ids != null && !ids.isEmpty()) {
            courseRepository.deleteByIds(ids);
        } else {
            throw new ResultException("课程ID列表不能为空");
        }
    }

    /**
     * 分页查询
     * @param pageable
     * @return
     */
    @Log
    public Page<Course> getAllWithPage(Pageable pageable){
        return courseRepository.findAll(pageable);
    }

    /**
     * 分页查询
     * @param example
     * @param pageable
     * @return
     */
    @Log
    public Page<Course> getAllWithPage(Example<Course> example, Pageable pageable){
        return courseRepository.findAll(example,pageable);
    }

    /**
     * 根据条件分页查询
     * @param courseQueryDTO
     * @param pageable
     * @return
     */
    @Log
    public Page<CoursePageVO> getCoursePageByConditions(CourseQueryDTO courseQueryDTO, Pageable pageable){
        return courseRepository.getCoursePageByConditions(courseQueryDTO, pageable);
    }

    /**
     * 更新课程人数
     *
     * @param cno
     * @param cNums
     * @return
     */
/*    public void updateCNums(String cno, Integer cNums) {
        courseRepository.updateCNums(cno, cNums);
    }*/


    /**
     * 根据选课表更新课程人数
     */
/*    public void updateCNumsBySC() {
        List<Course> courses = courseRepository.findAll();
        for (Course course : courses) {
            updateCNums(course.getCourseNo(),
                    Math.toIntExact(scRepository.countByCno(course.getCourseNo())));
        }
    }*/

}


